package com.xbongbong.paas.enums;

import com.xbongbong.i18n.util.I18nMessageUtil;
import com.xbongbong.saas.enums.XbbRefTypeEnum;
import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @author zcp
 * @version v1.0
 * @since v1.0
 */
@Getter
public enum OtherIncomeSheetTypeEnum {
    /**
     * code："1"
     * 已收款
     * 入口：其他收入单列表
     */
    OTHER_INCOME(SheetTypeEnum.OTHER_INCOME.getCode(), SheetTypeEnum.OTHER_INCOME.getI18nName(), SheetTypeEnum.OTHER_INCOME.getAlias(), SheetTypeEnum.OTHER_INCOME.getBusinessType(), SheetTypeEnum.OTHER_INCOME),
    /**
     * code："2"
     * 红冲已收款
     * 入口：其他收入单详情
     */
    RED_OTHER_INCOME(SheetTypeEnum.RED_OTHER_INCOME.getCode(), SheetTypeEnum.RED_OTHER_INCOME.getI18nName(), SheetTypeEnum.RED_OTHER_INCOME.getAlias(), SheetTypeEnum.RED_OTHER_INCOME.getBusinessType(), SheetTypeEnum.RED_OTHER_INCOME),

    /**
     * 未知
     */
    UNKNOWN(SheetTypeEnum.UNKNOWN.getCode(), SheetTypeEnum.UNKNOWN.getI18nName(), XbbRefTypeEnum.UNKNOWN.getAlias(), XbbRefTypeEnum.UNKNOWN.getCode(), SheetTypeEnum.UNKNOWN),
    ;

    /**
     * 类型code值
     */
    private String code;

    /**
     * 类型名称
     */
    private String name;

    /**
     * 类型attr
     */
    private String alias;

    /**
     * 业务code
     */
    private Integer businessType;

    /**
     * 其他收入单、其他支出单总枚举
     */
    private SheetTypeEnum sheetTypeEnum;

    OtherIncomeSheetTypeEnum(String code, String name, String alias, Integer businessType, SheetTypeEnum sheetTypeEnum){
        this.code = code;
        this.name = name;
        this.alias = alias;
        this.businessType = businessType;
        this.sheetTypeEnum = sheetTypeEnum;
    }

    /**
     * 通过枚举 businessType 获得枚举
     *
     * @param businessType 业务code
     *
     * @return XbbRefTypeEnum
     */
    public static OtherIncomeSheetTypeEnum getByBusinessType(Integer businessType) {
        for (OtherIncomeSheetTypeEnum cacheCode : values()) {
            if (Objects.equals(businessType, cacheCode.getBusinessType())) {
                return cacheCode;
            }
        }
        return UNKNOWN;
    }
    public static OtherIncomeSheetTypeEnum getByCode(String code) {
        for (OtherIncomeSheetTypeEnum cacheCode : values()) {
            if (Objects.equals(code, cacheCode.getCode())) {
                return cacheCode;
            }
        }
        return UNKNOWN;
    }
    /**
     * 中文名称获取枚举
     *
     * @param name 名称
     * @return com.xbongbong.paas.enums.PaymentSheetTypeEnum
     * @author 徐俊杰
     * @date 2019/11/21 14:48
     * @since v1.0
     */
    public static OtherIncomeSheetTypeEnum getByName(String name) {
        for (OtherIncomeSheetTypeEnum cache : values()) {
            if (Objects.equals(name, cache.getName())) {
                return cache;
            }
        }
        return UNKNOWN;
    }
    /**
     * 根据其他收入单类型判断是否为红冲类型
     * @param type 其他收入单类型
     * @return 是否为红冲 true为红冲
     * @author zcp
     */
    public static boolean isRed(String type){
        return Objects.equals(type, RED_OTHER_INCOME.code);
    }
    /**
     * 根据普通其他收入单类型code，得到对应的红冲类型的XbbRefTypeEnum的code
     * @param code 其他收入单类型type
     * @return java.lang.String
     * @author zcp
     * @date 19/12/2 002 19:39
     * @update 19/12/2 002 19:39
     * @since v1.0
     * @version v1.0
     */
    public static Integer getRedBusinessTypeByCode(String code) {
        if (Objects.equals(code, OTHER_INCOME.code)) {
            //code为已收款，则返回【红冲】已收款的businessType
            return RED_OTHER_INCOME.businessType;
        }
        return UNKNOWN.businessType;
    }

    /**
     * 根据普通其他收入单类型code，得到其本身的businessType
     * 其他收入单编辑、删除、打印按钮，要基于其他收入单类型得到businessType：因为其他收入单详情打开前端拿到的都是702，而要根据其他收入单data内的paymentSheetType确定具体是哪种类型其他收入单
     * @param code
     * @return java.lang.Integer
     * @author zcp
     * @date 19/12/3 003 16:20
     * @update 19/12/3 003 16:20
     * @since v1.0
     * @version v1.0
     */
    public static Integer getBusinessTypeByCode(String code) {
        OtherIncomeSheetTypeEnum otherIncomeSheetTypeEnum = getByCode(code);
        return otherIncomeSheetTypeEnum.businessType;
    }

    /**
     * 红冲类型
     *
     * @return java.util.List<java.lang.String>
     * @author zcp
     * @since v1.0
     */
    public static List<String> getRedCodeList() {
        return Arrays.asList(RED_OTHER_INCOME.code);
    }

    /**
     * 获取所有类型
     *
     * @return
     */
    public static List<String> getAllCodeList() {
        return Arrays.asList(OTHER_INCOME.code, RED_OTHER_INCOME.code);
    }

    public String getName() {
        return I18nMessageUtil.getMessage(name);
    }
}
